package com.foreveross.fetl.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.log4j.Logger;

import com.foreveross.fetl.common.HBaseTable;
import com.foreveross.fetl.common.hbase.client.HBaseHelper;
import com.foreveross.fetl.common.vo.FetlErrorMessage;

public class FetlErrorUtils {
	
	/**
	 * 官网和渠道差价的前五名
	 */
	public final static String top5="17001";
	/**
	 * 每天官网和渠道航班的差价统计
	 */
	public  final static String plus="17002";
	/**
	 * 实时价格处理
	 */
	public final static String last="17003";
	/**
	 * 统计历史最低价
	 */
	public final static String history="17004";
	
	/**
	 * 统计往返历史最低价
	 */
	public final static String historyDouble="17005";
	/**
	 * 生成航班信息
	 */
	public final static String generate="17006";
	/**
	 * 运价监控
	 */
	public final static String monitor="17007";
	/**
	 * 舱位预警
	 */
	public final static String cabin="17008";
	/**
	 * 价差预警
	 */
	public final static String ratio="17009";
	/**
	 * 竞价预警
	 */
	public final static String auction="17010";
	/**
	 * 实时往返价格处理
	 */
	public final static String lastDouble="17011";
	/**
	 * 南航国际报表
	 */
	public final static String csairReport="17012";
	/**
	 * 南航国内报表
	 */
	public final static String csairDomestic="17013";
	/**
	 * 南航淘宝价差
	 */
	public final static String csairTaobao="17014";
	/**
	 * 深航报表
	 */
	public final static String airSpread="17015";
	
	/**
	 * 国航国内OTA
	 */
	public final static String airChinaDomestic="17016";
	/**
	 * 国航国际OTA
	 */
	public final static String airChinaInternational="17017";
	/**
	 * 国航淘宝旗舰代理价差
	 */
	public final static String airChinaTaobao="17018";
	/**
	 * 元数据生成
	 */
	public final static String metadata="17019";
	/**
	 * 航信元数据
	 */
	public final static String metadataForAirs="17020";
	/**
	 * 当天元数据生成
	 */
	public final static String metadataAll="17021";
	/**
	 * 往返元数据生成
	 */
	public final static String metadataDouble="17022";
	/**
	 * 当天往返元数据生成
	 */
	public final static String metadataAllDouble="17023";
	/**
	 * 航线最低价
	 */
	public final static String lineDay="17024";
	/**
	 * 汇率抓取入库
	 */
	public final static String pereMoreData="17025";
	
	public final static String airLineCount="17026"; 
	
	
	private static Logger log = Logger.getLogger("saveError");
	
	public static Map<String,String> fetlNameMap =new HashMap<String,String>();
	static {
		if(null==fetlNameMap)
			fetlNameMap =new HashMap<String,String>();
		fetlNameMap.put(top5, "官网和渠道差价的前五名");  
		fetlNameMap.put(plus, "每天官网和渠道航班的差价统计");
		fetlNameMap.put(last, "实时价格处理");
		fetlNameMap.put(history, "统计历史最低价");
		fetlNameMap.put(historyDouble, "统计往返历史最低价");
		fetlNameMap.put(generate, "生成航班信息");
		fetlNameMap.put(monitor, "运价监控");
		fetlNameMap.put(cabin, "舱位预警");
		fetlNameMap.put(ratio, "价差预警");
		fetlNameMap.put(auction, "竞价预警");
		fetlNameMap.put(lastDouble, "实时往返价格处理");
		fetlNameMap.put(csairReport, "南航国际报表");
		fetlNameMap.put(csairDomestic, "南航国内报表");
		fetlNameMap.put(csairTaobao, "南航淘宝价差");
		fetlNameMap.put(airSpread, "深航报表");
		fetlNameMap.put(airChinaDomestic, "国航国内OTA");
		fetlNameMap.put(airChinaInternational, "国航国际OTA");
		fetlNameMap.put(airChinaTaobao, "国航淘宝旗舰代理价差");
		fetlNameMap.put(metadata, "元数据生成");
		fetlNameMap.put(metadataForAirs, "航信元数据");
		fetlNameMap.put(metadataAll, "当天元数据生成");
		fetlNameMap.put(metadataDouble, "往返元数据生成");
		fetlNameMap.put(metadataAllDouble, "当天往返元数据生成");
		fetlNameMap.put(lineDay, "航线最低价");
		fetlNameMap.put(pereMoreData, "汇率抓取入库");
		fetlNameMap.put(airLineCount, "航线抓取情况统计");
	}
	
	
	public static String apeedRowKey(String type,String grabDate,String createTime){
		String rowkey=type+grabDate+createTime+RowkeyUtils.getRandomInteger(5);
		return rowkey;
	}
	
	public static void saveToHbase(FetlErrorMessage vo){
		String rowkey=apeedRowKey(vo.getFetlCode(),vo.getGrabDate(),DateUtils.format(vo.getExcuteTime(), "HHmmssSSS"));
		Put put = new Put(rowkey.getBytes());
		if(null!=vo.getStartRowKey())
			put.add(Bytes.toBytes("message"), Bytes.toBytes("startRowKey"), Bytes.toBytes(vo.getStartRowKey()));
		if(null!=vo.getEndRowkey())
			put.add(Bytes.toBytes("message"), Bytes.toBytes("endRowkey"), Bytes.toBytes(vo.getEndRowkey()));
		if(null!=vo.getFetlName())
			put.add(Bytes.toBytes("message"), Bytes.toBytes("fetlName"), Bytes.toBytes(vo.getFetlName()));
		if(null!=vo.getFetlCode())
			put.add(Bytes.toBytes("message"), Bytes.toBytes("fetlCode"), Bytes.toBytes(vo.getFetlCode()));
		if(null!=vo.getFetlClass())
			put.add(Bytes.toBytes("message"), Bytes.toBytes("fetlClass"), Bytes.toBytes(vo.getFetlClass()));
		if(null!=vo.getExcuteTime())
			put.add(Bytes.toBytes("message"), Bytes.toBytes("excuteTime"), Bytes.toBytes(DateUtils.format(vo.getExcuteTime(), "yyyyMMddHHmmss")));
		if(null!=vo.getErrorMessage())
			put.add(Bytes.toBytes("message"), Bytes.toBytes("errorMessage"), Bytes.toBytes(vo.getErrorMessage()));
		if(null!=vo.getErrorClass())
			put.add(Bytes.toBytes("message"), Bytes.toBytes("errorClass"), Bytes.toBytes(vo.getErrorClass()));
		if(null!=vo.getGrabDate())
			put.add(Bytes.toBytes("message"), Bytes.toBytes("grabDate"), Bytes.toBytes(vo.getGrabDate()));
		if(null!=vo.getKeys() && vo.getKeys().size()>0){
			int i=0;
			for(String key: vo.getKeys()){
				put.add(Bytes.toBytes("message"), Bytes.toBytes("keys_"+i), Bytes.toBytes(key));
			}
		}
		try {
			HBaseHelper.addRecord(HBaseTable.TABLE_FETL_ERROR, put);
		} catch (Exception e) {
			log.error("can't save errorMessage ");
			log.info(StringUtils.getStackTrace(e));
		}
		
	}
	
	public static FetlErrorMessage getFormHbase(Map<String, Map<String, String>> fcv){
		if(null==fcv || fcv.isEmpty()){
			return null;
		}
		if(!fcv.containsKey("message")) return null;
		Map<String, String> map = fcv.get("message");
		FetlErrorMessage vo =new FetlErrorMessage();
		vo.setEndRowkey(map.get("endRowkey"));
		vo.setStartRowKey(map.get("startRowKey"));
		vo.setFetlClass(map.get("fetlClass"));
		vo.setFetlCode(map.get("fetlCode"));
		vo.setFetlName(map.get("fetlName"));
		vo.setErrorClass(map.get("errorClass"));
		vo.setErrorMessage(map.get("errorMessage"));
		vo.setGrabDate(map.get("grabDate"));
		vo.setExcuteTime(null==map.get("excuteTime")?null:DateUtils.parse(map.get("excuteTime"), "yyyyMMddHHmmss"));
		List<String> keys=new ArrayList<String>();
		for(String key:map.keySet()){
			if(key.startsWith("keys_"))
				keys.add(map.get(key));
		}
		if(null!=keys && keys.size()>0)
			vo.setKeys(keys);
		return vo;
	}

}
